package com.warm.middle.schedule.quartz.simple;

import org.quartz.*;
import org.springframework.context.annotation.Bean;

/**
 * @Date: 2019/12/3 15:59
 * @Author: LChuang
 * @Description:
 */
//@Configuration
public class SimpleQuartzConfig {

    /**
     * Scheduler：调度器。所有的调度都是由它控制。
     * Trigger： 触发器。决定什么时候来执行任务。
     * JobDetail & Job： JobDetail定义的是任务数据，而真正的执行逻辑是在Job中。
     *                      使用JobDetail + Job而不是Job，这是因为任务是有可能并发执行，
     *                      如果Scheduler直接使用Job，就会存在对同一个Job实例并发访问的问题。
     *                      而JobDetail & Job 方式，scheduler每次执行，都会根据JobDetail
     *                      创建一个新的Job实例，这样就可以规避并发访问的问题。
     */

    @Bean
    public JobDetail myJobDetail(){
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("myJob1", "myJobGroup1")
                //JobDataMap 可以给任务 execute 传递参数
                .usingJobData("job_param", "job_param1")
                .storeDurably()
                .build();
        return jobDetail;
    }

    @Bean
    public Trigger myTrigger(){
        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(myJobDetail())
                .withIdentity("myTrigger1", "myTriggerGroup1")
                .usingJobData("job_trigger_param", "job_trigger_param1")
                .startNow()
                .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
                .build();
        return trigger;
    }
}
